//
//  UserAccount.swift
//  glzbowei
//
//  Created by 高伦展 on 2017/12/6.
//  Copyright © 2017年 glz. All rights reserved.
//

import UIKit

//需要在要归档的对象中遵循NSCoding协议，并实现归档方法和解析方法
class UserAccount: NSObject,NSCoding{
    
    //用户授权的唯一票据，用于调用微博的开放接口，同时也是第三方应用验证微博用户登录的唯一票据，第三方应用应该用该票据和自己应用内的用户建立唯一影射关系，来识别登录状态，不能使用本返回值里的UID字段来做登录识别。
    @objc var access_token:String?
    //access_token的生命周期，单位是秒数。
    @objc var expires_in: TimeInterval = 0{
        didSet{
            //计算过期日期
            expireDate = Date(timeIntervalSinceNow: expires_in)
        }
    }
    //过期日期
    @objc var expireDate:Date?
    //授权用户的UID，本字段只是为了方便开发者，减少一次user/show接口调用而返回的，第三方应用不能用此字段作为用户登录状态的识别，只有access_token才是用户授权的唯一票据。
    @objc var uid:String?
    
    //名称
    @objc var screen_name:String?
    
    //图片
    @objc var avatar_large:String?
    
    init(dict:[String:AnyObject]) {
        super.init()
        
        setValuesForKeys(dict)
    }
    
     //没有实现 forUndefinedKey 函数,无法正常使用 KVC 设置数值  *****
    override func setValue(_ value: Any?, forUndefinedKey key: String) { }
    
    override var description: String{
        let keys = ["access_token","expires_in","expireDate","uid","screen_name","avatar_large"]
        
        return "\(dictionaryWithValues(forKeys: keys).description)"
    }
    
//    // MARK: - 保存当前对象
//    func saveUserAccount(){
//
//        //1.保存路径
//        var path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask,true).last!
//
//        //
//        path = (path as NSString).appendingPathComponent("account.plist")
//        
//        print(path)
//
//        //3.保存路径 会调用对象的 encode(with aCoder: NSCoder)  方法
//        NSKeyedArchiver.archiveRootObject(self, toFile: path)
//    }
    
    // MARK: - ‘键值’归档和解档
    // 归挡 - 在把当前对象保存到磁盘前，将对象编码成二进制数据 - 跟网络的序列化概念很像
    func encode(with aCoder: NSCoder) {
        aCoder.encode(access_token,forKey:"access_token")
        aCoder.encode(expireDate,forKey:"expireDate")
        aCoder.encode(uid,forKey:"uid")
        aCoder.encode(screen_name,forKey:"screen_name")
        aCoder.encode(avatar_large,forKey:"avatar_large")
    }
    
    // 解档 - 从磁盘加载二进制文件，转换成对象时调用 - 跟网络的反序列化很像
    // 'required' - 没有继承性，所有的对象只能解档出当前的类对象
    required init?(coder aDecoder:NSCoder) {
        access_token = aDecoder.decodeObject(forKey: "access_token") as? String
        expireDate = aDecoder.decodeObject(forKey: "expireDate") as? Date
        uid = aDecoder.decodeObject(forKey: "uid") as? String
        screen_name = aDecoder.decodeObject(forKey: "screen_name") as? String
        avatar_large = aDecoder.decodeObject(forKey: "avatar_large") as? String
    }
    
}

// 在 extension 中只允许写 便利构造函数，而不能写指定构造函数
// 不能定义存储型属性，定义存储型属性，会破坏类本身的结构
extension UserAccount{
    
}
